package br.com.pontoe.model.persistencia;

import java.sql.SQLException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import br.com.pontoe.controller.exceptions.FuncionarioInvalidoException;
import br.com.pontoe.controller.exceptions.PontoNaoRegistradoException;
import br.com.pontoe.model.entidades.Funcionario;
import br.com.pontoe.model.entidades.Registro;
import br.com.pontoe.model.persistencia.FuncionarioDAO;
import br.com.pontoe.model.persistencia.RegistroDAO;
import br.com.pontoe.util.ExceptionUtil;

public class RegistroPonto {

	private static RegistroPonto instance;
	private RegistroDAO daoRegistro = null;
	private FuncionarioDAO daoFuncionario = null;
	
	private RegistroPonto()
	{
		this.daoRegistro = new RegistroDAO();
		this.daoFuncionario = new FuncionarioDAO();
	}
	
	public static RegistroPonto getInstance() {
		if (instance == null){
			instance = new RegistroPonto();
		}
		return instance;
	}
	
	
	public Funcionario registrarPonto(int matricula, int senha) throws FuncionarioInvalidoException, PontoNaoRegistradoException {
		Funcionario funcionarioCadastrado = null;
		
		try {
			funcionarioCadastrado = daoFuncionario.localizar(matricula);

			if((funcionarioCadastrado != null) && (funcionarioCadastrado.getSenha() == senha))
			{
				Registro reg = new Registro();
				reg.setDataHora(new Date());
				reg.setFuncionario(funcionarioCadastrado);
				
				boolean resultado = daoRegistro.adiciona(reg);
				
				if(!resultado) {
					throw new PontoNaoRegistradoException();
				}
			}
			else 
			{
				throw new FuncionarioInvalidoException();
			}
		} 
		catch (SQLException e) {
			ExceptionUtil.tratarExcecao(e);
		}
		return funcionarioCadastrado;
	}
	
	public HashMap<Integer, List<Registro>> obterRegistros(Funcionario f, Date inicio, Date fim) {
		HashMap<Integer, List<Registro>> registros = null;
		
		try {	
			registros = daoRegistro.localizarPorDia(f, inicio, fim);
		} 
		catch (SQLException e) {
			ExceptionUtil.tratarExcecao(e);
		}
		return registros;
	}
	
}
